Lambda expression
자바는 객체를 기반으로 프로그램을 구현하는 언어이다.
만약 어떤 기능이 필요하다면 클래스를 먼저 만들고, 클래스 안에 기능을 구현한 메서드를
만든 후, 그 메서드를 호출하여야 한다.
타 언어 중 일부는
함수의 구현과 호출만으로 프로그램을 만들 수 있는 함수형 프로그래밍(Functional Programming;FP)를 지원한다.
함수형 프로그래밍은 함수가 입력받은 자료 이외에 외부 자료에 영향을 미치지 않기 때문에(pure function)
여러 자료를 동시에 처리하는 병렬 처리에 적합하며, 안정되고 확장성 있는 프로그램을 개발할 수 있다.
Java8 이후에는 Java 또한, 함수형 프로그래밍을 지원한다.
이를 람다식(Lambda expression) 이라고 한다.
Express lambda
(매개변수)->{실행문;}
람다식은 함수 이름이 없는 익명 함수를 만드는 것이다.
int add(int x, int y){
return x+y;
}
위의 메서드 add를 람다식을 이용하여 아래와 같이 표현할 수 있다.
(int x, int y)->{return x+y;}
grammar of Lambda expression
매개변수 자료형과 괄호 생략하기
str->{System.out.println(str);}
단, 매개변수가 두개인 경우는 괄호를 생략할 수 없다.
중괄호 생략하기
str->System.out.println(str);
중괄호 안의 구현 부분이 한문장인 경우 중괄호를 생략할 수 있다.
단, 중괄호 안의 구현 부분이 return 문일 경우 중괄호 생략이 불가능 하다.
return 생략하기
(x, y)->x+y
str->str.length()
중괄호 안의 구현 부분이 return문 하나인 경우
중괄호와 return 세미콜론(;) 모두 생략하고 식만 쓸 수 있다.
아래의 코드는 두 수 중 큰 수를 반환하는 함수를 람다식으로 구현한 것이다.
MyNumber.java(함수형 인터페이스)
package lambda;
@FunctionalInterface
public interface MyNumber {
int getMax(int num1, int num2);
}
TestMyNumber.java
package lambda;
public class TestMyNumber {
public static void main(String[] args) {
MyNumber max=(x,y)->(x>=y)?x:y;
System.out.println(max.getMax(10,20));
}
}
위와 같이 lambda 식을 사용하기 전에 함수형 인터페이스(MyNumber.java)를 먼저 선언해 주어야 한다.
함수형 인터페이스
함수형 언어에서는 함수만 따로 호출할 수 있지만, 자바에서는 참조 변수 없이 메서드를 호출할 수 없다.
따라서 람다식을 구현하기 위해서는 함수형 인터페이스를 만들고, 인터페이스에 람다식으로
구현할 메서드를 선언해야 한다.
인터페이스가 두 개 이상의 메서드를 가져서는 안된다.
@FunctionalInterface
@FunctionalInterface 애노테이션을 추가하면 함수형 인터페이스라는 의미이고,
메서드를 하나 이상 선언하면 오류가 발생한다.
객체 지향 프로그래밍 방식과 람다식
StringConcat.java
공용 인터페이스
package lambda;
public interface StringConcat {
public void makeString(String s1,String s2);
}
객체지향 프로그래밍
StringConcatImple.java
package lambda;
public class StringConcatImpl implements StringConcat{
@Override
public void makeString(String s1, String s2) {
System.out.println(s1+","+s2);
}
}
TestStringConcat.java
package lambda;
public class TestStringConcat {
public static void main(String[] args) {
String s1="Hello";
String s2="World";
StringConcatImpl concat1=new StringConcatImpl();
concat1.makeString(s1, s2);
}
}
람다식
TestStringConcat.java
package lambda;
public class TestStringConcat {
public static void main(String[] args) {
String s1="Hello";
String s2="World";
StringConcat concat2=(s,v)->System.out.println(s+","+v);
concat2.makeString(s1, s2);
}
}